/**
 * @param {number[]} nums
 * @return {number}
 */
var jump = function (nums) {
    // end：当前跳的右边界  jumps：最小跳数，max：当前跳数区域中能到达的最远的地方
    let end = 0, jumps = 0, max = 0, len = nums.length;
    for (let i = 0; i < len; i++) {
        // 右边界大于等于len-1就返回
        if (end >= len - 1) {
            return jumps
        }
        // 更新当前跳数最远距离
        if (nums[i] + i > max) max = nums[i] + i;
        // 指针走到右边界，更新
        if (i === end) {
            jumps++;
            end = max
            max = 0
        }
    }
};

// var jump = function (nums) {
//     const getMaxIndex = (nums, start, end) => {
//         let max = nums[start]
//         for (let i = start + 1; i <= end; i++) {
//             if (nums[i] > max) {
//                 max = nums[i]
//             }
//         }
//         return max;
//     }
//     let len = nums.length
//     let res = 0;
//     // 各自能到达的最远目的地
//     for(let i = 0; i < len; i++) {
//         nums[i] += i;
//     }
//     let bound = [0, 0];
//     while(bound[1] < len - 1) {
//         console.log(bound);
//         res++
//         if(getMaxIndex(nums, bound[0], bound[1]) >= len - 1) {
//             return res
//         } else {
//             let temp = bound[0]
//             bound[0] = bound[1] + 1;
//             bound[1] = getMaxIndex(nums, temp, bound[1])
//         }
//     }
//     return res
// };
// console.log(jump([2, 3, 1, 1, 4]));
// console.log(jump([2, 3, 0, 1, 4]));
console.log(jump([1, 1, 1, 1]));